#ifndef CASE_H_
#define CASE_H_

/* Typedefs */
typedef struct _Case Case;
typedef enum { tcSanctuaire, tcQuestion, tcPause, tcCombat, tcUndefined } TypeCase;

/* Includes */
#include "JeuCombat.h"
#include "Plateau.h"
#include "Personnage.h"
#include "Des.h"
#include <List.h>

#include "Erreur.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Destructor */
void deleteCase(Case* c);

/* Getters */
/**
 * \fn TypeCase caseGetType(Case* c)
 * \brief retourne le type de case
 * 
 * \param c Case
 * 
 * \return le type de case
 */
TypeCase caseGetType(Case* c);

/**
 * \fn Plateau* caseGetPlateau(Case* c)
 * 
 * \brief retourne le plateau associé à cette case
 * 
 * \param c Case
 * 
 * \return le plateau associé à cette case
 */
Plateau* caseGetPlateau(Case* c);

/**
 * \fn List* caseGetPersos(Case* c)
 * \brief retourne la liste des personnages présents sur cette case
 * 
 * \param c Case
 * 
 * \return la liste des personnages présents sur cette case
 */
List* caseGetPersos(Case* c);

/**
 * \fn Jeu* caseGetJeu(Case* c)
 * 
 * \brief retourne le jeu associé à cette case
 * 
 * \param c Case
 * 
 * \return le jeu associé à cette case
 */
Jeu* caseGetJeu(Case* c);

/**
 * \fn int caseExecuter(Case* c)
 * \brief execute l'action associée à cette case
 * 
 * \param c Case
 * 
 * \return 1 si tout s'est bien passé
 *         0 sinon
 */
int caseExecuter(Case* c);

/**
 * \fn int caseExecuterSortie(Case* c)
 * \brief execute l'action associée à la sortie de cette case
 * 
 * \param c Case
 * 
 * \return 1 si tout s'est bien passé
 *         0 sinon
 */
int caseExecuterSortie(Case* c);

/**
 * \fn int caseAjouterPerso(Case* c,Personnage* perso)
 * \brief Ajoute un personnage à une case
 * 
 * \param c Case
 * \param perso Personnage
 * 
 * \return 1 si tout s'est bien passé
 *         0 sinon
 */
int caseAjouterPerso(Case* c,Personnage* perso);

/**
 * \fn int caseEnleverPerso(Case* c,Personnage* perso)
 * \brief Enlève un personnage spécifique de la case
 * 
 * \param c Case
 * \param perso Personnage à enlever
 * 
 * \return 1 si l'opération a réussi
 *        0 sinon
 */
int caseEnleverPerso(Case* c,Personnage* perso);

/**
 * \fn Personnage* casePopPerso(Case* c)
 * \brief Enlève le premier personnage de la liste de personnage de cette case
 * 
 * \param c Case
 * 
 * \return le premier personnage de la liste de personnage de cette case
 */
Personnage* casePopPerso(Case* c);

/**
 * \fn int caseGetNbPersos(Case* c)
 * \brief Retourne le nombre de perso sur c ette case
 * 
 * \param c Case
 * 
 * \return le nombre de perso sur c ette case
 */
int caseGetNbPersos(Case* c);
#endif
